/* ************ FIGURAS.H *************************
 * 
 *   Proyecto 2: Ray Tracing Basico
 * 
 *   Prof.: 
 * 	 Francisco J. Torres Rojas PhD
 * 
 *   Autor:
 *   Andres Aguilar Umana
 *   200928927
 * 
 *   1 de Abril 2012
 * 
 ****************************************************/
#ifndef FIGURAS
#define FIGURAS
#include <math.h>
 #include <imagenes.h>
#include <common.h>
 


typedef struct _plano{
	Vector ABC;
	long double D;
	int dire;
} Plano;
typedef struct _esfera{
	Punto centro;
	long double radio,radio2;
	Color color;
	long double Kd;
	long double Ka;
	long double Ks;
	long double Kn;
	long double Kt;
	long double o1,o2,o3;
	int cortes;
	int *planos_corte;
	int textura,calado,bump;
	long double maxbump;
	long double tu,tv;
	Vector G,Norte,Correcto,U,V;
	long double DCorrecto, Dnorte;
} Esfera;
typedef struct _cilindro{
	Rayo rayo;
	long double h1,h2;
	long double radio,radio2;
	Color color;
	long double Kd;
	long double Ka;
	long double Ks;
	long double Kn;
	long double Kt;
	long double o1,o2,o3;
	long double d;
	long double A,B,C; //Valores precalculados para interseccion
	int cortes;
	int *planos_corte;
	int textura,calado,bump;
	long double maxbump;
	long double tu,tv;
	Vector G,Correcto,U,V;
	long double D;
} Cilindro;
typedef struct _cono{
	Rayo rayo;
	long double h1,h2;
	Color color;
	long double Kd;
	long double Ka;
	long double Ks;
	long double Kn;
	long double Kt;
	long double o1,o2,o3;
	long double d;
	long double uv;
	long double A,B,C; //Valores precalculados para interseccion
	int cortes;
	int *planos_corte;
} Cono;
typedef struct _poligono{
	int numPuntos;
	Punto *puntos;
	Color color;
	long double Kd;
	long double Ka;
	long double Ks;
	long double Kn;
	long double Kt;
	long double o1,o2,o3;
	long double D;
	Vector Normal,U,V;
	long double texD,texH;
	int aplastado;
	int cortes;
	int *planos_corte;
	int textura;
	int calado;
	int bump;
	long double maxBump;
	long double tu,tv;
	int disco;
	Punto centro;
	long double radio;
} Poligono;
typedef struct _cuadratica{
	long double A,B,C,D,E,F,G,H,J,K;
	Color color;
	long double Kd;
	long double Ka;
	long double Ks;
	long double Kn;
	long double Kt;
	long double o1,o2,o3;
	int cortes;
	int *planos_corte;
} Cuadratica;
typedef struct _luz{
	Punto posicion;
	long double c1;
	long double c2;
	long double c3;
	long double Intensidad;
	Color color;
} Luz;
typedef struct _camara{
	Punto Vrp;   //View Reference Point
	Vector Vpn;  //View Plane Normal
	Vector Vup;  //Vector Up
	long double Offset; //corrimiento en VPN del plano desde el VRP
	Vector U,V;
}Camara;
typedef struct _escena{
	int numEsferas;
	Esfera *Esferas;
	int numLuces;
	Luz *luces;
	int numPoligonos;
	Poligono *Poligonos;
	int numCilindros;
	Cilindro *Cilindros;
	int numConos;
	Cono *Conos;
	Cuadratica *Cuadraticas;
	int numCuadraticas;
	int numPlanos;
	int nivelEspejo;
	int nivelAntialiasing;
	int nivelTransparencia;
	Camara camara;
	
	int numTexturas;
	Imagen *Texturas;
	Plano *Planos;
	
	int resX;
	int resY;
	long double Xmin, Xmax; 
	long double Ymin, Ymax;
	long double Ia;
	Punto Ojo;
	Color Background;
} Escena;


void trasladarPunto(Punto *punto, Punto vrp);
void rotarPunto(Punto *punto, Vector u, Vector v, Vector n);
void rotarVector(Vector *vector, Vector u, Vector v, Vector n);

long double Normalizar(Vector *vec);
Interseccion InterEsfera(Rayo ray,long double *t,Esfera cirTemp,Escena *escena);
Vector NormalEsfera(void *esf,Punto inter);
void posicionTexturaEsfera(Esfera esf, int tex ,Punto pinter,Escena *escena, int *i, int *j, Vector Normal);
void trasladarEsfera(Esfera *esf,Punto vrp);
void rotarEsfera(Esfera *esf, Vector u, Vector v, Vector n);

Interseccion InterCilindro(Rayo ray,long double *t,Cilindro cilTemp,Escena *escena);
Vector NormalCilindro(void *cil,Punto inter);
void posicionTexturaCilindro(Cilindro cil, int tex ,Punto pinter,Escena *escena, int *i, int *j, Vector Normal);
void trasladarCilindro(Cilindro *cil,Punto vrp);
void rotarCilindro(Cilindro *cil, Vector u, Vector v, Vector n);

Interseccion InterPoligono(Rayo ray,long double *t,Poligono poliTemp,Escena *escena);
Vector NormalPoligono(void *esf,Punto inter);
void posicionTexturaPoligono(Poligono poli, int tex ,Punto pinter,Escena *escena, int *i, int *j);
void trasladarPoligono(Poligono *poli,Punto vrp);
void rotarPoligono(Poligono *poli, Vector u, Vector v, Vector n);

Interseccion InterCono(Rayo ray,long double *t,Cono conTemp,Escena *escena);
Vector NormalCono(void *con,Punto inter);
void trasladarCono(Cono *con,Punto vrp);
void rotarCono(Cono *con, Vector u, Vector v, Vector n);

Interseccion InterCuadratica(Rayo ray,long double *t,Cuadratica cuaTemp,Escena *escena);
Vector NormalCuadratica(void *cua,Punto inter);

#endif
